import { ref } from 'vue'
import type { Locale } from 'ant-design-vue/es/locale'
import type { App } from 'vue'
import { type LocaleSetupOptions, type SupportedLanguagesType, $t, setupI18n as coreSetup, loadLocalesMapFromDir } from '@general/locales'
import antdEnLocale from 'ant-design-vue/es/locale/en_US';
import antdDefaultLocale from 'ant-design-vue/es/locale/zh_CN';
import dayjs from 'dayjs'

const antLocale = ref<Locale>(antdDefaultLocale);
const modules = import.meta.glob('./langs/**/*.json');
const localesMap = loadLocalesMapFromDir(/\.\/langs\/([^/]+)\/(.*)\.json$/, modules);


/**
 * 加载应用特有的语言包
 * 这里也可以改造为从服务端获取翻译数据
 * @param lang
 */
async function loadMessages(lang: SupportedLanguagesType) {
    const [appLocaleMessages] = await Promise.all([
        localesMap[lang]?.(),
        loadThirdPartyMessage(lang)
    ])
    return appLocaleMessages?.default;
}

/**
 * 加载第三方组件库的语言包
 * @param lang
 */
async function loadThirdPartyMessage(lang: SupportedLanguagesType) {
    await Promise.all([loadAntLocale(lang), loadDayjsLocale(lang)])
}

/**
 * 加载dayjs的语言包
 */
async function loadDayjsLocale(lang: SupportedLanguagesType) {
    let locale;
    switch (lang) {
        case 'en-US':
            {
                locale = await import('dayjs/locale/en')
                break;
            }
        case 'zh-CN':
            {
                locale = await import('dayjs/locale/zh-cn')
                break;
            }
        default:
            {
                locale = await import('dayjs/locale/en')
            }
    }
    if (locale) {
        dayjs.locale(locale)
    } else {
        console.error(`Failed to load dayjs locale for ${lang}`);
    }
}

/**
 * 加载antd的语言包
 */
async function loadAntLocale(lang: SupportedLanguagesType) {
    switch (lang) {
        case 'en-US':
            {
                antLocale.value = antdEnLocale;
                break;
            }
        case 'zh-CN':
            {
                antLocale.value = antdDefaultLocale;
                break;
            }

    }
}

async function setupI18n(app: App, options: LocaleSetupOptions = {}) {
    await coreSetup(app, {
        defaultLocale: 'zh-CN',
        loadMessages,
        missingWarn: !import.meta.env.PROD,
        ...options
    })
}

export { $t, antLocale, setupI18n }